import { getLandslideFeatures } from './landslideService'
import { mockReverseGeocode } from './amapService'

/**
 * 区域分布数据接口
 */
export interface AreaDistribution {
  name: string
  value: number
}

/**
 * 时间分布数据接口
 */
export interface TimeDistribution {
  name: string
  value: number
}

/**
 * 趋势数据接口
 */
export interface TrendData {
  month: string
  count: number
}

/**
 * 风险等级分布数据接口
 */
export interface SeverityDistribution {
  name: string
  value: number
}

/**
 * 统计数据接口
 */
export interface StatisticsData {
  totalCount: number
  recentCount: number
  highRiskCount: number
  areaData: AreaDistribution[]
  timeData: TimeDistribution[]
  trendData: TrendData[]
  severityData: SeverityDistribution[]
}

/**
 * 获取滑坡统计数据
 * @returns 统计数据
 */
export async function getLandslideStatistics(): Promise<StatisticsData> {
  try {
    // 获取滑坡要素数据
    const features = await getLandslideFeatures()

    // 计算总数
    const totalCount = features.length

    // 模拟数据 - 在实际应用中应该从真实数据中提取
    // 区域分布数据 - 使用真实数据
    // 初始化区域计数
    const areaCounts: Record<string, number> = {
      巴州区: 0,
      恩阳区: 0,
      通江县: 0,
      南江县: 0,
      平昌县: 0,
    }

    // 统计各区域的滑坡数量
    console.log('开始处理滑坡要素的区域分布...')
    console.log(`总共有 ${features.length} 个滑坡要素`)

    features.forEach((feature: any, index: number) => {
      if (feature.geometry) {
        const { longitude, latitude } = feature.geometry

        console.log(`要素 ${index + 1}: 经度=${longitude}, 纬度=${latitude}`)

        // 使用高德地图API的逆地理编码服务获取行政区
        // 注意：这里使用模拟函数，实际应用中应该使用真实的API
        const geoInfo = mockReverseGeocode(longitude, latitude)

        console.log(`要素 ${index + 1} 被分配到: ${geoInfo.district}`)

        // 更新区域计数
        if (areaCounts[geoInfo.district] !== undefined) {
          areaCounts[geoInfo.district]++
        }
      }
    })

    console.log('区域分布统计结果:')
    console.log(areaCounts)

    // 转换为图表所需格式
    const areaData = [
      { name: '巴州区', value: areaCounts['巴州区'] },
      { name: '恩阳区', value: areaCounts['恩阳区'] },
      { name: '通江县', value: areaCounts['通江县'] },
      { name: '南江县', value: areaCounts['南江县'] },
      { name: '平昌县', value: areaCounts['平昌县'] },
    ]

    // 时间分布数据 - 使用真实数据
    const yearCounts: Record<string, number> = {
      '2021年': 0,
      '2022年': 0,
      '2023年': 0,
      '2024年': 0,
      '2025年': 0,
    }

    // 统计各年份的滑坡数量
    features.forEach((feature: any) => {
      const occuredTime = feature.attributes.occuredTime || ''

      // 提取年份 (格式: "2025-04-29 20:12:27")
      if (occuredTime && occuredTime.length >= 4) {
        const year = occuredTime.substring(0, 4)
        const yearKey = `${year}年`
        if (yearCounts[yearKey] !== undefined) {
          yearCounts[yearKey]++
        } else {
          // 如果是其他年份，默认归入2025年
          yearCounts['2025年']++
        }
      }
    })

    // 转换为图表所需格式
    const timeData = [
      { name: '2021年', value: yearCounts['2021年'] },
      { name: '2022年', value: yearCounts['2022年'] },
      { name: '2023年', value: yearCounts['2023年'] },
      { name: '2024年', value: yearCounts['2024年'] },
      { name: '2025年', value: yearCounts['2025年'] },
    ]

    // 月份趋势数据 - 使用真实数据
    const monthCounts: Record<string, number> = {
      '1月': 0,
      '2月': 0,
      '3月': 0,
      '4月': 0,
      '5月': 0,
      '6月': 0,
      '7月': 0,
      '8月': 0,
      '9月': 0,
      '10月': 0,
      '11月': 0,
      '12月': 0,
    }

    // 统计2025年各月份的滑坡数量
    const targetYear = 2025
    features.forEach((feature: any) => {
      const occuredTime = feature.attributes.occuredTime || ''

      // 提取年份和月份 (格式: "2025-04-29 20:12:27")
      if (occuredTime && occuredTime.length >= 7) {
        const year = parseInt(occuredTime.substring(0, 4))
        const month = parseInt(occuredTime.substring(5, 7))

        // 只统计2025年的数据
        if (year === targetYear && month >= 1 && month <= 12) {
          const monthKey = `${month}月`
          monthCounts[monthKey]++
        }
      }
    })

    // 转换为趋势图表所需格式
    const trendData = [
      { month: '1月', count: monthCounts['1月'] },
      { month: '2月', count: monthCounts['2月'] },
      { month: '3月', count: monthCounts['3月'] },
      { month: '4月', count: monthCounts['4月'] },
      { month: '5月', count: monthCounts['5月'] },
      { month: '6月', count: monthCounts['6月'] },
      { month: '7月', count: monthCounts['7月'] },
      { month: '8月', count: monthCounts['8月'] },
      { month: '9月', count: monthCounts['9月'] },
      { month: '10月', count: monthCounts['10月'] },
      { month: '11月', count: monthCounts['11月'] },
      { month: '12月', count: monthCounts['12月'] },
    ]

    // 风险等级分布 - 使用真实数据
    const riskLevelCounts: Record<string, number> = {
      低风险: 0,
      中风险: 0,
      高风险: 0,
      极高风险: 0,
    }

    // 统计各风险等级的数量
    features.forEach((feature: any) => {
      const riskLevel = feature.attributes.riskLevel || '低风险'
      if (riskLevelCounts[riskLevel] !== undefined) {
        riskLevelCounts[riskLevel]++
      }
    })

    // 转换为图表所需格式
    const severityData = [
      { name: '低风险', value: riskLevelCounts['低风险'] },
      { name: '中风险', value: riskLevelCounts['中风险'] },
      { name: '高风险', value: riskLevelCounts['高风险'] },
      { name: '极高风险', value: riskLevelCounts['极高风险'] },
    ]

    // 最近一个月的滑坡数量 - 仍使用模拟数据
    const recentCount = Math.floor(totalCount * 0.15)

    // 高风险滑坡数量 - 使用真实数据
    const highRiskCount = riskLevelCounts['高风险'] + riskLevelCounts['极高风险']

    return {
      totalCount,
      recentCount,
      highRiskCount,
      areaData,
      timeData,
      trendData,
      severityData,
    }
  } catch (error) {
    console.error('获取统计数据失败:', error)
    throw error
  }
}

/**
 * 按区域分组统计滑坡数据
 * @returns 按区域分组的统计数据
 */
export async function getLandslideByArea(): Promise<AreaDistribution[]> {
  try {
    const statistics = await getLandslideStatistics()
    return statistics.areaData
  } catch (error) {
    console.error('按区域统计滑坡数据失败:', error)
    throw error
  }
}

/**
 * 按时间分组统计滑坡数据
 * @returns 按时间分组的统计数据
 */
export async function getLandslideByTime(): Promise<TimeDistribution[]> {
  try {
    const statistics = await getLandslideStatistics()
    return statistics.timeData
  } catch (error) {
    console.error('按时间统计滑坡数据失败:', error)
    throw error
  }
}

/**
 * 获取滑坡趋势数据
 * @returns 滑坡趋势数据
 */
export async function getLandslideTrend(): Promise<TrendData[]> {
  try {
    const statistics = await getLandslideStatistics()
    return statistics.trendData
  } catch (error) {
    console.error('获取滑坡趋势数据失败:', error)
    throw error
  }
}

/**
 * 获取滑坡风险等级分布
 * @returns 滑坡风险等级分布
 */
export async function getLandslideSeverity(): Promise<SeverityDistribution[]> {
  try {
    const statistics = await getLandslideStatistics()
    return statistics.severityData
  } catch (error) {
    console.error('获取滑坡风险等级分布失败:', error)
    throw error
  }
}
